package boardData;

/**
 * Klasse die relevante Daten und Methoden eines Elements des Boards enth�llt.
 * @author Fabian Hewer
 * @version V0.a.2 (6.7.'11)
 *
 */
public class BoardElementOld {
	//Variablen
	private boolean occupied = false;
	private boolean colourWhite;
	private boolean valid = false;
	private char piece;
	
	//Konstanten
	private static final String WRONG_PIECE = "Angegebene Figur gibt es nicht: ";
	private static final String NEED_MORE_PARAS = "Fehlende Parameter!";

	//--// Konstruktoren
	public BoardElementOld(boolean occupied, boolean colourWhite, char piece) {
		this.occupied = occupied;
		this.colourWhite = colourWhite;
		if(piece == 'p' || piece == 'r' || piece == 'n' 
		|| piece == 'k' || piece == 'q' || piece == 'b')
			this.piece = piece;
		else
			throw new RuntimeException(WRONG_PIECE);
		valid = true;
	}
	
	public BoardElementOld(boolean occupied) {
		if(occupied == false) {
			this.occupied = occupied;
			this.colourWhite = true;
			this.piece = 'e';
		} else
			throw new RuntimeException(NEED_MORE_PARAS);
		valid = true;
	}
	
	public BoardElementOld() {
		colourWhite = true;
		piece = 'e';
	}
	//--//
	
	/**
	 * Methode die zwei BoardElemente miteinander auf gleiche Stellung vergleicht.
	 * @param testElement Element, dass mit diesem verglichen werden soll
	 * @return true wenn beide Elemente nicht g�ltig oder nicht besetzt sind oder wenn auf beiden der selbe Figurentyp in selber Farbe steht.
	 */
	public boolean matches(BoardElementOld testElement) {
		if(!valid && !testElement.valid)
			return true;
		if(!occupied && !testElement.occupied)
			return true;
		if(colourWhite == testElement.colourWhite && piece == testElement.piece)
			return true;
		return false;
	}
	
	/**
	 * Methode um die auf dem Feld stehende Figur wei� zu f�rben.
	 */
	void ColourWhite() {/*default daher Package visibility*/
		colourWhite = true;
	}
	
	/**
	 * Mehtode um die auf dem Feld stehende Figur schwarz zu f�rben.
	 */
	void ColourBlack() {
		colourWhite = false;
	}
	
	/**
	 * Methode die die Farbe der auf dem Feld stehenden Figur zur�ckgibt.
	 * @return true wenn wei� (Achtung! gibt auch etwas zur�ck, wenn keine Figur auf dem Feld steht! Auf isoccupied() pr�fen!)
	 */
	boolean isWhite() {
		return colourWhite;
	}
	
	/**
	 * Methode die angibt ob das Feld besetzt ist
	 * @return true wenn das Feld besetzt ist
	 */
	boolean isOccupied() {
		return occupied;
	}
		
	/**
	 * Methode die das Feld auf besetzt setzt
	 */
	void setOccupied() {
		occupied = true;
	}
	
	/**
	 * Methode die das Feld vom Besetztstatus befreit
	 */
	void notOccupied() {
		occupied = false;
		piece = 'e';
	}
	
	/**
	 * Gibt die Figur zur�ck, die auf dem Feld steht
	 * @return Figur die auf dem Feld steht in englischer Notation (p,r,b,n,k,q) und 'e' wenn das Feld leer ist.
	 */
	char getPiece() {
		return piece;
	}
	
	/**
	 * Methode die den Typ der Figur auf dem Feld festlegt.
	 * @param piece Figur in englischer Notation (p,r,b,n,k,q).
	 */
	void setPiece(char piece) {
		if(piece == 'p' || piece == 'r' || piece == 'n' 
		|| piece == 'k' || piece == 'q' || piece == 'b')
			this.piece = piece;
		else
			throw new RuntimeException(WRONG_PIECE + piece);
	}
		
	/**
	 * Methode die zur�ckgibt ob ein Feld ein g�ltiges Feld ist. (Also Teil des Schachfelds)
	 * @return true wenn das Feld g�ltig ist.
	 */
	boolean isValid() {
		return valid;
	}
	
	public String toString() {
		String ausgabe;
		if(!valid)
			ausgabe = "n/v";
		else if(!occupied)
			ausgabe = "___";
		else if(colourWhite)
			ausgabe = (" " + piece + " ").toUpperCase();
		else
			ausgabe = (" " + piece + " ");
		return ausgabe;
	}
}
